package com.wans.guli.common.validator.realization;

import com.wans.guli.common.validator.annotation.ListValues;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;

/**
 * ListValues注解的验证器实现类
 * 用于验证Integer类型的值是否在指定的值列表中
 */
public class ListValuesConstraintValidator implements ConstraintValidator<ListValues, Integer> {

    private HashSet<Integer> listValues;

    /**
     * 初始化验证器，为验证准备所需的上下文信息
     * 在执行isValid方法之前 guaranteed 调用此方法
     *
     * @param constraintAnnotation 指定约束声明的注解实例
     */
    @Override
    public void initialize(ListValues constraintAnnotation) {
        listValues = new HashSet<>();
        for (int value : constraintAnnotation.values()) {
            listValues.add(value);
        }
    }

    /**
     * 执行实际的验证逻辑
     * 验证给定的Integer值是否符合ListValues注解定义的约束条件
     * 此方法的实现必须保证线程安全，因为可能被并发访问
     *
     * @param value   需要验证的对象值
     * @param context 约束验证的上下文环境
     * @return 如果value通过约束验证返回true，否则返回false
     */
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {

        return listValues.contains(value);
    }
}

